package com.itheima.myreggie2.config;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.itheima.myreggie2.common.ApplicationContext;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

/**   按照框架要求编写元数据对象处理器，在此类中统一为公共字段赋值，此类需要实现MetaObjectHandler接口。
 *    自定义元数据对象处理器
 */
@Slf4j      //输出日志
@Component  //加这个注解原因：当前自动填充的工具类，需要交给spring容器管理
public class MyMetaObjectHandler implements MetaObjectHandler {

    /**
     *    插入操作，自动填充     第一次执行添加，把更新也要设置上
     * @param metaObject               添加人，时间
     *                                 更新人，时间
     */
  /*  @Override
    public void insertFill(MetaObject metaObject) {

        log.info("start insert fill..."+metaObject);//通过源对象metaObject设置属性
        long id = Thread.currentThread().getId();
        log.info("MyMetaObjectHandler*************当前操作线程的id:{}",id);

        metaObject.setValue("createTime", LocalDateTime.now());
        metaObject.setValue("creatUser", ApplicationContext.getEmpId()); //当前这个用户id是写死的，需要
        //需要设置成当前登陆成用户信息 ，怎么拿到当前登录用户的id呢，存在哪呢？存在session里，怎么去拿session?
        //在这个自动填充的工具类是拿不到session的     在common包下新建一个全局的上下文对象 ApplicationContext

        metaObject.setValue("updateTime",LocalDateTime.now());
        metaObject.setValue("updateUser",ApplicationContext.getEmpId());

    }*/
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("start ilnsert fil ....:"+metaObject);
        long id = Thread.currentThread().getId();
        log.info("MyMetaObjectHandler***************************当前操作线程的id:{}",id);

        metaObject.setValue("createTime", LocalDateTime.now());
        metaObject.setValue("createUser", ApplicationContext.getId());

        metaObject.setValue("updateTime", LocalDateTime.now());

        metaObject.setValue("updateUser",ApplicationContext.getId());
    }


    /**
     *    更新操作，自动填充     谁更新的，什么时候更新的
     * @param metaObject
     */
    @Override
    public void updateFill(MetaObject metaObject) {

        log.info("start update fill..."+metaObject);
        metaObject.setValue("updateTime",LocalDateTime.now());
        metaObject.setValue("updateUser",ApplicationContext.getId());


//前面我们已经完成了后台系统的员工管理功能的开发，在新增员工时需要设置创建时间、创建人、修改时间、修改人等字段，
// 在编辑员工时需要设置修改时间、修改人等字段。这些字段属于公共字段，也就是也就是在我们的系统中很多表中都会有这些字段
        //如果都按照上述的操作方式来处理这些公共字段, 需要在每一个业务方法中进行操作,
        // 编码相对冗余、繁琐，那能不能对于这些公共字段在某个地方统一处理，来简化开发呢？

        //  在实体类的属性上加入@TableField注解，指定自动填充的策略。
        //Mybatis Plus公共字段自动填充，也就是在插入或者更新的时候为指定字段赋予指定的值，
        // 使用它的好处就是可以统一对这些字段进行处理，避免了重复代码。
        // 在上述的问题分析中，我们提到有四个公共字段，需要在新增/更新中进行赋值操作


        /**    配置了这个自定义元数据对象处理器后， 去表现层,把那些重复 字段给注销掉，测试下
         *
         */

        /** 到mp官网， 自动填充功能 注解填充字段@TableField（...fill= FieldFill.INSERT）
         *  自定义实现类  MyMetaObjectHandler
         *    提供了一个fill属性，未来在进行添加和更新的时候，mybatisPlus就会检查当前的字段
         *    有没有添加这个  @TableField 注解，加了这个注解就会自动去查找这个自动填充处理器类
         *    这个类要交给spring容器管理，未来才能从容器里拿到这个自动填充工具去帮我们填充指定的字段数据
         *
         *    步骤一： 找到实体对象，在你需要填充的字段上面加上 注解 @TableField（fill= FieldFill.INSERT）
         *                                                   @TableField（fill= FieldFill.INSERT_UPDATE）
         *    步骤二：配置一个自动填充处理器  MyMetaObjectHandler
         *           在官网上复制下自定义实现类，在common报下创建这个实现类 ，需要加上@Component注解
         *           因为当前自动填充的工具类，需要交给spring容器管理
         */


    }
}
